package com.main.antenne;

import java.util.ArrayList;
import java.util.List;

import ErgebnisFilterung.DatenFilter;
import ErgebnisFilterung.Spiel;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;

public class ErgebnisActivity extends Activity {

	private static ArrayList<List<Spiel>> datumsListe;
	private int spieltag = 0;
	private ExpandableListView listView;
	private Spinner spieltagAuswahl;
	private ProgressDialog dialog;
	private DownloadTask task;
	private int spieltagAnzahl;
	private static int aktuellerSpieltag;
	private SpinnerAdapter prevAdapter = null;
	private boolean ausklappen = false;
	private TextView text;
	private AlertDialog alert;
	private boolean keineVerbindung = false;
	public static Spiel geklicktesSpiel;

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.ergebnis_layout);

		ausklappen = leseEinstellungenAusDatei();

		spieltagAuswahl = (Spinner) findViewById(R.id.spieltagAuswahl);
		spieltagAuswahl.setMinimumWidth(Math.round(MainActivity
				.getWindowWidth(this) * (float) 0.65));

		listView = (ExpandableListView) findViewById(R.id.spieleliste);

		final PopupWindow popup = macheOrtPopupWindow();
		popup.setAnimationStyle(R.style.AnimationPopup);

		// Dialog erstellen
		dialog = new ProgressDialog(this, ProgressDialog.THEME_HOLO_DARK);
		dialog.setMessage("Laden...");
		dialog.setCancelable(false);

		// Um bei Orientation-Change
		task = (DownloadTask) getLastNonConfigurationInstance();

		// Wenn noch kein Task gestartet ist, starte neuen Download-Task;
		// sonst
		// ersetze Activity des laufenden Tasks
		if (task == null) {
			task = new DownloadTask(this);
			task.execute();
		} else {
			task.setActivity(this);
			updateAktuellerSpieltag();
			updateSpinnerAdapter();
			updateAdapter();
		}

		spieltagAuswahl.setOnItemSelectedListener(new OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> parentView, View arg1,
					int i, long arg3) {
				if (prevAdapter == spieltagAuswahl.getAdapter()) {
					prüfeVerbindung();
					if (!keineVerbindung) {
						spieltag = i + 1;
						task = (DownloadTask) getLastNonConfigurationInstance();

						// Wenn noch kein Task gestartet ist, starte
						// neuen
						// Download-Task; sonst
						// ersetze Activity des laufenden Tasks
						if (task == null) {
							task = new DownloadTask(ErgebnisActivity.this);
							task.execute();
						} else {
							task.setActivity(ErgebnisActivity.this);
							updateAktuellerSpieltag();
							updateSpinnerAdapter();
							updateAdapter();
						}
					}
				}
				prevAdapter = spieltagAuswahl.getAdapter();
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {
				return;
			}
		});

		Button tabellenButton = (Button) findViewById(R.id.tabellen_button);
		tabellenButton.setWidth(Math.round(MainActivity.getWindowWidth(this)
				* (float) 0.3));
		tabellenButton.setMinHeight(50);
		tabellenButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				prüfeVerbindung();
				if (!keineVerbindung) {
					startActivity(new AntenneIntent(ErgebnisActivity.this,
							TabellenActivity.class));
					overridePendingTransition(R.anim.openactivity,
							R.anim.activitydisappear);
				}
			}
		});

		listView.setOnChildClickListener(new OnChildClickListener() {

			@Override
			public boolean onChildClick(ExpandableListView parent, View v,
					int groupPosition, int childPosition, long id) {
				geklicktesSpiel = datumsListe.get(groupPosition).get(
						childPosition);
				startActivity(new AntenneIntent(ErgebnisActivity.this,
						SpielActivity.class));
				overridePendingTransition(R.anim.openactivity,
						R.anim.activitydisappear);

				return false;
			}
		});
	}

	@Override
	protected void onStop() {
		super.onStop();
		// Bevor die Activity gestoppt wird, z.B. bei einer Bildschirmdrehung,
		// wird der Ladedialog oder der Fehlermeldungsdialog beendet, um eine
		// Exception zu vermeiden
		if (dialog != null)
			dismissDialog();
		if (alert != null && alert.isShowing())
			alert.dismiss();
	}

	public int getSpieltag() {
		return spieltag;
	}

	public void setSpieltag(int spieltag) {
		this.spieltag = spieltag;
	}

	/*
	 * anzeigen des Ladedialogs
	 */
	void showDialog() {
		dialog.show();
	}

	/*
	 * beenden des Ladedialogs
	 */
	void dismissDialog() {
		dialog.dismiss();
	}

	/*
	 * die aktuellen Adapter werden auf die aktualisierten Adapder aus dem
	 * Download-Task gesetzt
	 */
	void updateAdapter() {
		listView.setAdapter(task.adapter);
		listView.setIndicatorBounds(listView.getWidth() - 70,
				listView.getWidth());
		refreshErgebnisse();
	}

	/*
	 * falls die Einstellung "alle ausklappen" gew�hlt wird, werden je nach
	 * Einstellung alle Ergebnisse aus- oder eingeklappt
	 */
	void refreshErgebnisse() {
		if (task.adapter != null) {
			if (ausklappen)
				for (int i = 0; i < task.adapter.getGroupCount(); i++)
					listView.expandGroup(i);
			else
				for (int i = 0; i < task.adapter.getGroupCount(); i++)
					listView.collapseGroup(i);
		}
	}

	void updateSpieltagAnzahl() {
		spieltagAnzahl = task.spAnz;
	}

	void updateAktuellerSpieltag() {
		aktuellerSpieltag = task.aktSp;
	}

	void updateSpinnerAdapter() {
		int spinnerSelection = spieltagAuswahl.getSelectedItemPosition();
		spieltagAuswahl.setAdapter(task.spinnerAdapter);
		spieltagAuswahl.setSelection(spinnerSelection);
		if (prevAdapter == null) {
			spieltagAuswahl.setSelection(aktuellerSpieltag - 1);
		}

	}

	@Override
	@Deprecated
	public Object onRetainNonConfigurationInstance() {
		task.activityNull();
		return task;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Auswahl "Einstellungen" wird zum Men� hinzugef�gt
		menu.add("Einstellungen").setOnMenuItemClickListener(
				new OnMenuItemClickListener() {

					@Override
					public boolean onMenuItemClick(MenuItem item) {
						// Beim Klick auf "Einstellungen" wird ein Dialog
						// ge�ffnet, bei dem man Einstellungen vornehmen kann
						AlertDialog.Builder b = new AlertDialog.Builder(
								ErgebnisActivity.this);
						b.setTitle("Einstellungen");

						final CheckBox check = new CheckBox(
								ErgebnisActivity.this);
						check.setWidth(200);
						check.setText("Ergebnisse immer ausklappen");
						check.setBackgroundColor(Color.rgb(175, 175, 175));
						check.setChecked(ausklappen);
						b.setView(check);
						b.setPositiveButton(R.string.ok,
								new DialogInterface.OnClickListener() {

									@Override
									public void onClick(DialogInterface dialog,
											int which) {

										ausklappen = check.isChecked();
										schreibeEinstellungenInDatei();
										refreshErgebnisse();
										dialog.dismiss();
									}
								});
						AlertDialog dialog = b.create();
						dialog.show();
						return true;
					}
				});

		MainActivity.addLiveStreamMenuItem(menu, this);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		MainActivity.updateLiveStreamMenuItemText(menu.getItem(1));
		return super.onPrepareOptionsMenu(menu);
	}

	// Die gegebenen Einstellungen werden gespeichert, damit sie
	// bei einem Neustart noch verf�gbar sind
	void schreibeEinstellungenInDatei() {
		SharedPreferences settings;
		SharedPreferences.Editor editor;
		settings = this.getPreferences(MODE_WORLD_WRITEABLE);
		editor = settings.edit();
		editor.putBoolean("ausklappen", ausklappen);
		editor.commit();
	}

	// Die Einstellungen werden gelesen und als R�ckgabewert
	// geliefert
	boolean leseEinstellungenAusDatei() {
		SharedPreferences settings;
		settings = this.getPreferences(MODE_WORLD_READABLE);
		return settings.getBoolean("ausklappen", false);
	}

	PopupWindow macheOrtPopupWindow() {
		PopupWindow p = new PopupWindow(this);
		p.setBackgroundDrawable(getResources().getDrawable(R.drawable.popup));
		p.setClippingEnabled(true);

		LinearLayout layout = new LinearLayout(this);
		layout.setOrientation(LinearLayout.HORIZONTAL);
		ImageView img = new ImageView(this);
		img.setImageDrawable(getResources().getDrawable(
				R.drawable.ic_action_place));
		text = new TextView(this);
		text.setTextAppearance(this, R.style.Schwarze_Schrift);
		text.setGravity(Gravity.CENTER);
		img.setPadding(5, 0, 7, 0);
		text.setPadding(5, 0, 7, 0);
		layout.addView(img);
		layout.addView(text);
		layout.setGravity(Gravity.CENTER);

		p.setContentView(layout);
		p.setWidth(400);
		p.setHeight(90);
		p.setOutsideTouchable(true);
		p.setFocusable(true);

		return p;
	}

	// DOWNLOAD TASK
	public class DownloadTask extends AsyncTask<Void, Void, Void> {
		ArrayList<Spiel> spiele;
		ExpandableListAdapter adapter;
		int spAnz = 0, aktSp;
		int id = 0;
		ErgebnisActivity activity;
		SpinnerAdapter spinnerAdapter;

		public DownloadTask(ErgebnisActivity activity) {
			this.activity = activity;
		}

		@Override
		public void onPreExecute() {
			activity.showDialog();
		}

		@Override
		public Void doInBackground(Void... unused) {
			DatenFilter filter = new DatenFilter(activity, "spiele",
					activity.spieltag);
			filter.start();

			try {
				filter.getZuAktualisieren().acquire();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			spiele = filter.getSpieleListe();
			spAnz = DatenFilter.getSpieltagAnzahl();
			aktSp = DatenFilter.getAktuellerSpieltag();

			return null;
		}

		@Override
		public void onPostExecute(Void unused) {
			if (!spiele.isEmpty()) {
				datumsListe = new ArrayList<List<Spiel>>();
				ArrayList<Spiel> list = new ArrayList<Spiel>();
				list.add(spiele.get(0));
				for (int i = 0; i < spiele.size() - 1; i++) {
					if (spiele
							.get(i)
							.getDatumFormatiert()
							.toString()
							.equals(spiele.get(i + 1).getDatumFormatiert()
									.toString())) {
						list.add(spiele.get(i + 1));
					} else {
						datumsListe.add(list);
						list = new ArrayList<Spiel>();
						list.add(spiele.get(i + 1));
					}
				}
				datumsListe.add(list);

				adapter = new ExpandableListAdapter() {

					@Override
					public void unregisterDataSetObserver(
							DataSetObserver observer) {
						// TODO Auto-generated method stub

					}

					@Override
					public void registerDataSetObserver(DataSetObserver observer) {
						// TODO Auto-generated method stub

					}

					@Override
					public void onGroupExpanded(int groupPosition) {
						// TODO Auto-generated method stub

					}

					@Override
					public void onGroupCollapsed(int groupPosition) {
						// TODO Auto-generated method stub

					}

					@Override
					public boolean isEmpty() {
						// TODO Auto-generated method stub
						return false;
					}

					@Override
					public boolean isChildSelectable(int groupPosition,
							int childPosition) {
						return true;
					}

					@Override
					public boolean hasStableIds() {
						return false;
					}

					@Override
					public View getGroupView(int groupPosition,
							boolean isExpanded, View convertView,
							ViewGroup parent) {
						LinearLayout row = new LinearLayout(activity);
						row.setOrientation(LinearLayout.HORIZONTAL);
						TextView text = new TextView(activity);
						Spiel spiel = datumsListe.get(groupPosition).get(0);
						text.setText(spiel.getTag_fuer_anzeige() + ", "
								+ spiel.getDatum_fuer_anzeige() + "\n"
								+ spiel.getZeit());
						text.setTextAppearance(getApplicationContext(),
								R.style.Rote_Schrift_Normal);
						text.setMinimumHeight(110);
						row.setMinimumHeight(110);
						text.setGravity(Gravity.CENTER_VERTICAL);
						// text.setWidth(Math.round(getWindowWidth()*(float)0.8));
						text.setMaxWidth(Math.round(MainActivity
								.getWindowWidth(ErgebnisActivity.this)
								* (float) 0.8));
						text.setPadding(15, 0, 0, 0);
						row.addView(text);
						row.setBackgroundResource(R.drawable.farbverlauf_hellgelb_nach_dunkelgelb);
						return row;
					}

					@Override
					public long getGroupId(int groupPosition) {
						return groupPosition;
					}

					@Override
					public int getGroupCount() {
						return datumsListe.size();
					}

					@Override
					public Object getGroup(int groupPosition) {
						return datumsListe.get(groupPosition);
					}

					@Override
					public long getCombinedGroupId(long groupId) {
						// TODO Auto-generated method stub
						return 0;
					}

					@Override
					public long getCombinedChildId(long groupId, long childId) {
						// TODO Auto-generated method stub
						return 0;
					}

					@Override
					public int getChildrenCount(int groupPosition) {
						return datumsListe.get(groupPosition).size();
					}

					@Override
					public View getChildView(int groupPosition,
							int childPosition, boolean isLastChild,
							View convertView, ViewGroup parent) {
						LinearLayout row = new LinearLayout(activity);
						row.setOrientation(LinearLayout.HORIZONTAL);
						TextView erg = new TextView(row.getContext());
						TextView text1 = new TextView(row.getContext());
						TextView text2 = new TextView(row.getContext());
						Spiel spiel = datumsListe.get(groupPosition).get(
								childPosition);
						text1.setText(spiel.getHeim());
						text2.setText(spiel.getGast());

						if (spiel.isLive())
							erg.setBackgroundResource(R.drawable.ergebnis_hintergrund_live);
						else if (!spiel.spielBevorstehend())
							erg.setBackgroundResource(R.drawable.ergebnis_hintergrund_vorbei);
						else
							erg.setBackgroundResource(R.drawable.ergebnis_hintergrund);

						erg.setText(spiel.getErgebnis());
						text1.setTextAppearance(getApplicationContext(),
								R.style.Schwarze_Schrift);
						text2.setTextAppearance(getApplicationContext(),
								R.style.Schwarze_Schrift);
						text1.setGravity(Gravity.CENTER);
						text2.setGravity(Gravity.CENTER);
						erg.setTextAppearance(getApplicationContext(),
								R.style.Schwarze_Schrift);
						erg.setGravity(Gravity.CENTER);

						text1.setWidth((int) Math.round(MainActivity
								.getWindowWidth(ErgebnisActivity.this) * 0.375));
						text2.setWidth((int) Math.round(MainActivity
								.getWindowWidth(ErgebnisActivity.this) * 0.375));
						text1.setMinimumHeight(80);
						text2.setMinimumHeight(80);
						erg.setWidth((int) Math.round(MainActivity
								.getWindowWidth(ErgebnisActivity.this) * 0.25));
						// text1.setHeight(80);
						// text2.setHeight(80);
						erg.setMinimumHeight(80);
						erg.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);

						row.addView(text1);
						row.addView(erg);
						row.addView(text2);
						row.setMinimumHeight(80);
						row.setGravity(Gravity.CENTER);

						if (childPosition % 2 == 0)
							row.setBackgroundResource(R.drawable.dunkelgelb_listitem_background);
						else
							row.setBackgroundResource(R.drawable.hellgelb_listitem_background);
						return row;
					}

					@Override
					public long getChildId(int groupPosition, int childPosition) {
						// TODO Auto-generated method stub
						return 0;
					}

					@Override
					public Object getChild(int groupPosition, int childPosition) {
						return datumsListe.get(groupPosition)
								.get(childPosition);
					}

					@Override
					public boolean areAllItemsEnabled() {
						return true;
					}
				};

				spinnerAdapter = new SpinnerAdapter() {

					@Override
					public void unregisterDataSetObserver(
							DataSetObserver observer) {
						// TODO Auto-generated method stub

					}

					@Override
					public void registerDataSetObserver(DataSetObserver observer) {
						// TODO Auto-generated method stub

					}

					@Override
					public boolean isEmpty() {
						// TODO Auto-generated method stub
						return false;
					}

					@Override
					public boolean hasStableIds() {
						return true;
					}

					@Override
					public int getViewTypeCount() {
						return 1;
					}

					@Override
					public View getView(int position, View convertView,
							ViewGroup parent) {
						TextView text = new TextView(ErgebnisActivity.this);
						text.setMinimumHeight(80);
						text.setGravity(Gravity.CENTER);
						text.setTextAppearance(ErgebnisActivity.this,
								R.style.Schwarze_Schrift);
						text.setText(Integer.toString(position + 1)
								+ ". Spieltag");
						return text;
					}

					@Override
					public int getItemViewType(int position) {
						// TODO Auto-generated method stub
						return 0;
					}

					@Override
					public long getItemId(int position) {
						return position;
					}

					@Override
					public Object getItem(int position) {
						return new String(Integer.toString(position + 1)
								+ ". Spieltag");
					}

					@Override
					public int getCount() {
						return spieltagAnzahl;
					}

					@Override
					public View getDropDownView(int position, View convertView,
							ViewGroup parent) {
						TextView text = new TextView(ErgebnisActivity.this);
						text.setGravity(Gravity.CENTER_VERTICAL);
						text.setPadding(10, 0, 0, 0);

						if (position + 1 == aktuellerSpieltag)
							text.setBackgroundResource(R.drawable.farbverlauf_hellgelb_nach_dunkelgelb);
						else if (position == activity.spieltagAuswahl
								.getSelectedItemPosition())
							text.setBackgroundResource(R.drawable.spinner_selected_grau_hintergrund_mit_farbverlauf);
						else
							text.setBackgroundResource(R.drawable.spinner_grau_hintergrund_mit_farbverlauf);
						text.setTextAppearance(ErgebnisActivity.this,
								R.style.Schwarze_Schrift);
						text.setText(Integer.toString(position + 1)
								+ ". Spieltag");
						text.setMinimumHeight(80);

						return text;
					}
				};

				updateSpieltagAnzahl();
				updateAktuellerSpieltag();
				updateAdapter();
				activity.updateSpinnerAdapter();
				activity.dismissDialog();
			}
		}

		void activityNull() {
			activity = null;
		}

		void setActivity(ErgebnisActivity activity) {
			this.activity = activity;
		}
	}

	@Override
	public void onBackPressed() {
		finish();
		overridePendingTransition(R.anim.reopenactivity,
				R.anim.activitydisappear);
	}

	/*
	 * Pr�ft ob eine Verbindung vorhanden ist falls nicht wird keineVerbindung
	 * auf true gesetzt und eine Fehlermeldung erstellt sonst wird
	 * keineVerbindung auf false gesetzt
	 */
	void prüfeVerbindung() {
		if (!verbindungVorhanden()) {
			keineVerbindung = true;
			macheVerbindungsfehlerDialog();
		} else
			keineVerbindung = false;
	}

	/*
	 * Pr�ft, ob eine Internetverbindung vorhanden ist falls nicht wird false
	 * zur�ckgeliefert falls schon wird true zur�ckgeliefert
	 */
	boolean verbindungVorhanden() {
		ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info == null) {
			return false;
		} else
			return true;
	}

	/*
	 * Ein Dialog wird erstellt, der anzeigt, dass keine Internetverbindung
	 * vorhanden ist mit dem OK-Button wird der Dialog beendet
	 */
	void macheVerbindungsfehlerDialog() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Keine Internetverbindung");
		builder.setMessage("Bitte Internetverbindung aktivieren!");
		builder.setCancelable(false);
		builder.setNegativeButton("Ok", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				alert.dismiss();
			}
		});
		alert = builder.create();
		alert.show();
	}

}
